#ifndef QA39C_H
#define QA39C_H

#include <QObject>
#include <QThread>
#include <QTimer>
#include "modbus/modbus.h"


#define DEBUG_A39C

#define PWR_ON          1
#define PWR_OFF         0

#define SLAVE_ID_LF     (1)     //左前轮Left-Front
#define SLAVE_ID_LE     (2)     //左后轮Left-End
#define SLAVE_ID_RF     (3)     //右前轮Right-Front
#define SLAVE_ID_RE     (4)     //右后轮Right-End
#define SLAVE_ID_CP     (5)     //彩屏板载称重单元的从机地址：05.

#define DATA_IDX_LF     (0)     //左前轮Left-Front
#define DATA_IDX_LE     (1)     //左后轮Left-End
#define DATA_IDX_RF     (2)     //右前轮Right-Front
#define DATA_IDX_RE     (3)     //右后轮Right-End
#define DATA_IDX_CP     (4)     //彩屏板载称重单元的响应数据偏移。

/*对外的返回数据。
 * .len是返回数据的寄存器个数。最大16个。
 * .data[]是返回数据。按寄存器最小单位存放，即uint16。
*/
typedef struct _RSP_DATA{
    uint16_t len;
    uint8_t unlink;         //断开连接标志，非0值。
    uint8_t unecho_cnt;     //无响应计数器。
    uint16_t data[6];
}RSP_DATA;


/*针对轮询4个称重板时，得到的响应。
*/
typedef struct _RSP_DATAS{
    uint16_t len;
    RSP_DATA rsp_data[5];   //目前最多5个，[0,3]是称重板，[4]是彩屏板载称重单元。
}RSP_DATAS;

// 声明为元类型（放在结构体定义后）
Q_DECLARE_METATYPE(RSP_DATAS)

class QA39C : public QThread
{
    Q_OBJECT

public:
    explicit QA39C(QObject *parent = nullptr);

    qint16 cnt_retry;           //modbus尝试次数。
    qint16 interval_retry;      //尝试之间的间隔，单位是100ms。
    qint8 slave_id;             //从机地址，会连接不同的从机。
    modbus_t *ctx;
    qint8 flag_stop;            //推出run()标志。
    qint8 flag_op_zero;         //执行清零操作。

signals:
    //void finish(int num);
    void finish(RSP_DATAS rsps);  //发射信号，并返回modbus响应数据。
    //void finish(qint32 num);

protected:
    /* 重写run方法，继承QThread的类，只有run方法是在新的线程里 */
    virtual void run() override;

    void do_zero(void);

private:
    qint32 cnt_txrx;                //Modbus交互次数。
    int32_t init_modbus();
    void pwr_a39c(qint8 state);
    void init_rsps(void);

    RSP_DATAS rsps;
};


#endif // QA39C_H
